home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.5)
-
- import cStringIO
- import struct
- import random
- import time
- import dns.exception as dns
- import dns.tsig as dns
- QUESTION = 0
- ANSWER = 1
- AUTHORITY = 2
- ADDITIONAL = 3
-
- class Renderer(object):
-
- def __init__(self, id = None, flags = 0, max_size = 65535, origin = None):
- self.output = cStringIO.StringIO()
- if id is None:
- self.id = random.randint(0, 65535)
- else:
- self.id = id
- self.flags = flags
- self.max_size = max_size
- self.origin = origin
- self.compress = { }
- self.section = QUESTION
- self.counts = [
- 0,
- 0,
- 0,
- 0]
- self.output.write('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
- self.mac = ''
-
-
- def _rollback(self, where):
- self.output.seek(where)
- self.output.truncate()
- keys_to_delete = []
- for k, v in self.compress.iteritems():
- if v >= where:
- keys_to_delete.append(k)
- continue
-
- for k in keys_to_delete:
- del self.compress[k]
-
-
-
- def _set_section(self, section):
- if self.section != section:
- if self.section > section:
- raise dns.exception.FormError
-
- self.section = section
-
-
-
- def add_question(self, qname, rdtype, rdclass = dns.rdataclass.IN):
- self._set_section(QUESTION)
- before = self.output.tell()
- qname.to_wire(self.output, self.compress, self.origin)
- self.output.write(struct.pack('!HH', rdtype, rdclass))
- after = self.output.tell()
- if after >= self.max_size:
- self._rollback(before)
- raise dns.exception.TooBig
-
- self.counts[QUESTION] += 1
-
-
- def add_rrset(self, section, rrset, **kw):
- self._set_section(section)
- before = self.output.tell()
- n = rrset.to_wire(self.output, self.compress, self.origin, **kw)
- after = self.output.tell()
- if after >= self.max_size:
- self._rollback(before)
- raise dns.exception.TooBig
-
- self.counts[section] += n
-
-
- def add_rdataset(self, section, name, rdataset, **kw):
- self._set_section(section)
- before = self.output.tell()
- n = rdataset.to_wire(name, self.output, self.compress, self.origin, **kw)
- after = self.output.tell()
- if after >= self.max_size:
- self._rollback(before)
- raise dns.exception.TooBig
-
- self.counts[section] += n
-
-
- def add_edns(self, edns, ednsflags, payload):
- ednsflags &= 0xFF00FFFFL
- ednsflags |= edns << 16
- self._set_section(ADDITIONAL)
- before = self.output.tell()
- self.output.write(struct.pack('!BHHIH', 0, dns.rdatatype.OPT, payload, ednsflags, 0))
- after = self.output.tell()
- if after >= self.max_size:
- self._rollback(before)
- raise dns.exception.TooBig
-
- self.counts[ADDITIONAL] += 1
-
-
- def add_tsig(self, keyname, secret, fudge, id, tsig_error, other_data, request_mac):
- self._set_section(ADDITIONAL)
- before = self.output.tell()
- s = self.output.getvalue()
- (tsig_rdata, self.mac, ctx) = dns.tsig.hmac_md5(s, keyname, secret, int(time.time()), fudge, id, tsig_error, other_data, request_mac)
- keyname.to_wire(self.output, self.compress, self.origin)
- self.output.write(struct.pack('!HHIH', dns.rdatatype.TSIG, dns.rdataclass.ANY, 0, 0))
- rdata_start = self.output.tell()
- self.output.write(tsig_rdata)
- after = self.output.tell()
- if after >= self.max_size:
- self._rollback(before)
- raise dns.exception.TooBig
-
- self.output.seek(rdata_start - 2)
- self.output.write(struct.pack('!H', after - rdata_start))
- self.counts[ADDITIONAL] += 1
- self.output.seek(10)
- self.output.write(struct.pack('!H', self.counts[ADDITIONAL]))
- self.output.seek(0, 2)
-
-
- def write_header(self):
- self.output.seek(0)
- self.output.write(struct.pack('!HHHHHH', self.id, self.flags, self.counts[0], self.counts[1], self.counts[2], self.counts[3]))
- self.output.seek(0, 2)
-
-
- def get_wire(self):
- return self.output.getvalue()
-
-
-